Tomohiro Abe

python
plot(2d)
plot(contour)

contour plot with python

gluplotで contourplot するように作ったファイルを使って contourplot することを目標にする。

preparation

plot(2d) をみよ。

データの読み込み

前半は plot(2d)と同じ。
plotdir = ""
file_id='M1_1000_tanB30_quarkEDM.dat'
rfile = plotdir + file_id
data = np.loadtxt(rfile, comments='#')

X = data[:,4] # 5列目のデータを取得。:は全範囲の意味。配列の番号は 0 から始まることに注意。
Y = data[:,5]
Z = data[:,6] 
次に、contour plot をするために2次元配列を作らないといけない。
ここで
X=[-180,-180,...,-180,-170,...,-170,-160,.......,...., 180]
Y=[-10, -9, -8, ..., 9, 10,-10,-9,...]
となっているとする。 これを次のようにすれば2次元配列ができる。(もっとスマートな方法があったが忘れた。)
aaaa=np.where(X==-180.) # X で -180 が入っている場所を全て特定する。
start=aaaa[0][0]        # -180 の最初の番地
goal=aaaa[0][-1]        # -180 の最後の番地

minX = X[start]         # X の最初の数。この例だと -180.
maxX = X[-1]            # X の最後の数。この例だと +180.
diffX = X[goal+1]-X[start] # ひとブロックで数字がいくつ変わるか。今の場合 -170 と -180 の差なので +10。

xnew=np.reshape(X, ((maxX-minX)/diffX + 1, goal+1)) #[[-180,...,-180],[-170,...,-170],...]
ynew=np.reshape(Y, ((maxX-minX)/diffX + 1, goal+1)) #[[-10,-9...,9,10],[-10,-9...,9,10],...]
znew=np.reshape(Z, ((maxX-minX)/diffX + 1, goal+1)) #[[...],...,[...]] 
これでデータの準備完了。足したり引いたりもできる。Z+3 とか。Z + X とか。

contourplot

# contourplot で lavel を 1.2e-3 ではなく 1.2\times 10^{-3} にするのに必要な関数.
f = ticker.ScalarFormatter(useOffset=False, useMathText=True)
g = lambda x,pos : "${}$".format(f._formatSciNotation('%1.10e' % x))

# 軸の名前など
plt.figure(figsize=(8,5))
plt.gca().set_aspect('equal') 
plt.title( r"$d_n$ [e cm] (positive $GG\tilde{G}$)", fontsize=14)
plt.ylabel(r'Arg($M_1$)')
plt.xlabel(r'Arg($\mu$)')
plt.xticks([-180,-90,0,90,180])
plt.yticks([-180,-90,0,90,180])
plt.axes().xaxis.set_minor_locator(MultipleLocator(10))
plt.axes().yaxis.set_minor_locator(MultipleLocator(10))

# 等高線を描く
CR=plt.contour(xnew,ynew,znew,colors='black',levels=[-10**(-27.),-1.6*10**(-27.),-5*10**(-28.),10**(-27.),1.6*10**(-27.),5*10**(-28.)])

# 等高線の値をどう表示するか指定
plt.clabel(CR, fontsize=11, fmt=ticker.FuncFormatter(g))

# 塗りつぶし
plt.contourf(xnew,ynew,znew,levels=[-2.6*10**(-26.),-1])
plt.contourf(xnew,ynew,znew,levels=[2.6*10**(-26.),1])

# 出力
plt.savefig('hoge.pdf', bbox_inches="tight")
# もっと余白を小さくするなら以下。ただし、軸が見切れるときがある。
# plt.savefig('hoge.pdf', bbox_inches="tight", pad_inches=0.0)

plt.close()
ここで contour は等高線、contourf はぬりつぶし。 重ねたい場合は何行も書く。

contour の option について

plt.clabel について